#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <time.h>
#include <sys/wait.h>
#include <dirent.h>
#include <syslog.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>
#include <mysql/mysql.h>

#define ARGS_CHECK(argc, num){if(argc != num){fprintf(stderr, "args error !\n"); return -1;} }
#define ERROR_CHECK(ret, num, msg){if(ret==num){perror(msg); return -1;}}
#define THREAD_ERROR_CHECK(ret, msg){if(ret!=0){fprintf(stderr, "%s:%s \n", msg,strerror(ret));}}

#include "queue.h"

typedef struct status_s{

    int num; // 子线程的个数
    pthread_t * thread_ids;// 线程的id

    queue_t queue;
    
    pthread_mutex_t lock;
    pthread_cond_t cond;

    int exit_flag;// 退出标记位: 0正常, 1要求退出 
}status_t;

typedef struct client_msg{
    char name[100];//用户名
    char pswd[100];//用户密码
    int log_st;//登录状态，0表示未登录，1表示已登录
    char path[100];//目前工作路径
}cmsg_t;

typedef struct order_s{
    int order;//命令
    int kv_num;//键值对个数
    char buf[1000];//发送信息，由键值对组成，例:name=zs&pswd=123456&path=zs/work/&dirname=dir1
}order_t;

enum{
    CD,
    LS,
    PUTS,
    GETS,
    RM,
    PWD,
    MKDIR,
    RGST,//registe 注册
    LOGIN//登录
};

void *thread_main(void *p);
// 初始化共享的数据
int init_status(status_t * status, int num);
// 启动子线程
int init_thread(status_t *status);
// 启动socket监听
int init_socket(int *socket_fd, char *port, char *ip);
// 添加epoll监听
int add_epoll(int epoll_fd, int fd);
// 和客户端进行通信
int do_worker(int net_fd);

int recv_order(int net_fd, order_t* order_s);
